#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>


// 全局变量，存储总的余票
int ticketAmount = 2;

// 1. 创建信号量
sem_t lock;

// 线程函数
void* ticketAgent(void* arg) {

	// 信号量 <= 0 时，忙式等待（占用cpu）
	// 信号量 > 0 时，信号量 -1，并往下执行
	sem_wait(&lock);

	// 记录总票数
	int amount = ticketAmount;
	
	sleep(1);
	
	if (amount > 0) {
		// 存在余票
		printf("One ticked sold!\n");
		amount--;
	} else {
		// 余票不足
		printf("Ticked sold out!\n");
	}
	
	// 更新总的余票
	ticketAmount = amount;

	// 信号量 + 1
	sem_post(&lock);

	pthread_exit(0);
}

int main() {

	// 初始化信号量
	sem_init(&lock, 0, 1);

	pthread_t ticket_tid[2];
	
	for (int i = 0; i < 2; i++) {
		pthread_create(ticket_tid + i, NULL, ticketAgent, NULL);
	}
	
	// 等待子线程执行结束
	for (int i = 0; i < 2; i++) {
		pthread_join(ticket_tid[i], NULL);
	}
	
	printf("The left ticket is %d\n", ticketAmount);

	// 销毁信号量
	sem_destroy(&lock);

	return 0;
}
